/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package be.hogent.iii.project.server.berichthandlers;

import be.hogent.iii.project.common.bericht.Bericht;
import be.hogent.iii.project.common.bericht.SpelenLijstBericht;
import be.hogent.iii.project.common.bericht.SpelersLijstBericht;
import be.hogent.iii.project.common.bericht.login.IngelogdAntwoordBericht;
import be.hogent.iii.project.common.bericht.login.LoginGegevensBericht;
import be.hogent.iii.project.server.databank.DataStorage;
import be.hogent.iii.project.common.game.objecten.Speler;
import be.hogent.iii.project.common.gameroom.objecten.GameRoomData;
import be.hogent.iii.project.server.netwerk.Server;
import com.thoughtworks.xstream.XStream;

/**
 *
 * @author Caribou
 */
public class ServerLoginGegevensBerichtHandler implements BerichtHandler{

    public ServerLoginGegevensBerichtHandler(){}
    
     public void handle(Bericht bericht){
        LoginGegevensBericht gegevens = new LoginGegevensBericht();
        Class loginKlasse = gegevens.getClass();
        gegevens = (LoginGegevensBericht)loginKlasse.cast(bericht);
        //System.out.println("We willen " + gegevens.getGebruikersnaam() + " inloggen. ");
        DataStorage db = new DataStorage();
        Speler speler = db.login(gegevens.getGebruikersnaam(), gegevens.getWachtwoord());
        //System.out.println("Speler: " + speler.getNick());
        IngelogdAntwoordBericht antwoord = new IngelogdAntwoordBericht(speler);
        
        //controleren of de speler al ingelogd is
        for(int i = 0; i < GameRoomData.getGameRoomData().getSpelerslijst().getSpelerslijst().size(); i++){
            if(speler != null && speler.getNick().equals(GameRoomData.getGameRoomData().getSpelerslijst().getSpelerslijst().get(i).getNick())){
               antwoord.setReedsIngelogd(true);
            }
        }
        XStream xStream = new XStream();
        String msg = xStream.toXML(antwoord);
        //het antwoord terugsturen naar de client
        Server.getServer().stuurBerichtNaarClient(bericht.getZender(), msg);
        
        //als de speler succesvol is ingelogd
        if(speler != null && ! antwoord.isReedsIngelogd()){
            //speler toevoegen aan de main chat
            Server.getServer().voegClientToeAanPool("mainChat", bericht.getZender(),Server.getServer().getSocketVanClient(bericht.getZender()));
            
            //speler toevoegen aan de spelerlijst
            System.out.println("Voeg speler " + speler.getNick() + "toe aan spelerslijst");
            GameRoomData.getGameRoomData().getSpelerslijst().voegSpelerToe(speler);
            
            //de speler vanaf nu laten identificeren door zijn nick, niet zijn socket
            Server.getServer().veranderNickname(bericht.getZender(), speler.getNick());
            
            SpelersLijstBericht spelers = new SpelersLijstBericht(GameRoomData.getGameRoomData().getSpelerslijst());
            msg = xStream.toXML(spelers);
            Server.getServer().stuurBerichtNaarPool("mainChat", msg);
            
            SpelenLijstBericht spelen = new SpelenLijstBericht(GameRoomData.getGameRoomData().getSpelenlijst());
            msg = xStream.toXML(spelen);
            Server.getServer().stuurBerichtNaarPool("mainChat", msg);
        }
        //als de login niet gelukt is, verwijderen van de server (doen we niet meer!) Gaf probs met herproberen aan clientzijde
        //client wordt nog wel altijd weggesmeten als de loginframe van de client afgesloten wordt.
        else {
            //Server.getServer().verwijderClientVanServer(bericht.getZender());
        }
    }       
}
